package com.ruoyi.yys.service.impl;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.lang.Opt;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.ruoyi.common.constant.ExcelStants;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.exception.CustomException;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.yys.domain.ImportExportTemplate;
import com.ruoyi.yys.domain.JdbcConfig;
import com.ruoyi.yys.mapper.ImportExportTemplateMapper;
import com.ruoyi.yys.service.IImportExportTemplateService;
import com.ruoyi.yys.util.OssUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 导入导出模板Service业务层处理
 *
 * @author xinyin
 * @date 2022-12-07
 */
@Service
@Slf4j
@RequiredArgsConstructor
public class ImportExportTemplateServiceImpl implements IImportExportTemplateService {
    @Autowired
    private ImportExportTemplateMapper importExportTemplateMapper;

    /**
     * 查询导入导出模板
     *
     * @param id 导入导出模板主键
     * @return 导入导出模板
     */
    @Override
    public ImportExportTemplate selectImportExportTemplateById(Long id) {
        return importExportTemplateMapper.selectImportExportTemplateById(id);
    }

    /**
     * 查询导入导出模板列表
     *
     * @param importExportTemplate 导入导出模板
     * @return 导入导出模板
     */
    @Override
    public List<ImportExportTemplate> selectImportExportTemplateList(ImportExportTemplate importExportTemplate) {
        return importExportTemplateMapper.selectImportExportTemplateList(importExportTemplate);
    }

    /**
     * 新增导入导出模板
     *
     * @param importExportTemplate 导入导出模板
     * @return 结果
     */
    @Override
    public int insertImportExportTemplate(ImportExportTemplate importExportTemplate) {
        importExportTemplate.setCreateBy(SecurityUtils.getUsername());
        importExportTemplate.setCreateTime(DateUtils.getNowDate());
        return importExportTemplateMapper.insertImportExportTemplate(importExportTemplate);
    }

    /**
     * 修改导入导出模板
     *
     * @param importExportTemplate 导入导出模板
     * @return 结果
     */
    @Override
    public int updateImportExportTemplate(ImportExportTemplate importExportTemplate) {
        if(importExportTemplate.getTemplateType() == 1){
            //如果为sql模板，将清除模板文件路径
            importExportTemplate.setFilePath(null);
        }
        importExportTemplate.setUpdateBy(SecurityUtils.getUsername());
        importExportTemplate.setUpdateTime(DateUtils.getNowDate());
        return importExportTemplateMapper.updateImportExportTemplate(importExportTemplate);
    }

    /**
     * 批量删除导入导出模板
     *
     * @param ids 需要删除的导入导出模板主键
     * @return 结果
     */
    @Override
    public int deleteImportExportTemplateByIds(Long[] ids) {
        return importExportTemplateMapper.deleteImportExportTemplateByIds(ids);
    }

    /**
     * 删除导入导出模板信息
     *
     * @param id 导入导出模板主键
     * @return 结果
     */
    @Override
    public int deleteImportExportTemplateById(Long id) {
        return importExportTemplateMapper.deleteImportExportTemplateById(id);
    }

    /**
     * downloda模板ossid文件
     *
     * @param id       id
     * @param fileName 文件名称
     * @param response 响应
     * @return {@link R}
     */
    @Override
    public R downlodaTemplateOssFileById(Long id, String fileName, HttpServletResponse response) {
        ImportExportTemplate template = importExportTemplateMapper.selectImportExportTemplateById(id);
        if (ObjectUtil.isEmpty(template)) {
            return R.fail("模板不存在");
        }
        if (template.getTemplateType() != 2) {
            return R.fail("不是excel模板");
        }
        if (template.getFileType() != 2) {
            return R.fail("不是oss文件");
        }
        String ossPath = template.getFilePath();
        if (StrUtil.isBlank(ossPath)) {
            return R.fail("oss路径为空");
        }
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
        //下载文件
        String filePath = OssUtils.downloadFileNow(ossPath);
        if (StrUtil.isBlank(fileName)) {
            fileName = FileUtil.getName(ossPath);
        } else {
            String fileType = FileUtils.getFileType(FileUtil.getName(ossPath));
            fileName = FileUtils.getFileNameRomveSuffix(fileName) + "." + fileType;
        }
        try {
            //文件编码
            FileUtils.setAttachmentResponseHeader(response, fileName);
            FileUtils.writeBytes(filePath, response.getOutputStream());
            //删除本地文件
            FileUtil.del(filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return R.ok("下载成功");
    }

    /**
     * 上传excel模板
     *
     * @param id   id
     * @param file 文件
     * @return int
     */
    @Override
    public int uploadExcelTemplate(Long id, MultipartFile file) {
        ImportExportTemplate template = importExportTemplateMapper.selectImportExportTemplateById(id);
        Opt.ofNullable(template).orElseThrow(()->new ServiceException(HttpStatus.BAD_REQUEST, "模板不存在"));
        if (template.getTemplateType() != 2) {
            throw new ServiceException(HttpStatus.BAD_REQUEST, "该模板不是excel模板，不能上传文件");
        }
        if (template.getFileType() != 2) {
            throw new ServiceException(HttpStatus.BAD_REQUEST, "该模板文件类型不是oss文件类型，不能上传文件");
        }
        String ossPath = ExcelStants.EXCEL_PATH + file.getOriginalFilename();
        try {
            OssUtils.fileUpload(file.getInputStream(), ossPath);
        } catch (Exception e) {
            throw new CustomException(HttpStatus.ERROR, "文件上传出错：" + e.getMessage());
        }
        return importExportTemplateMapper.updateImportExportTemplate(new ImportExportTemplate().setFilePath(ossPath).setId(id));
    }

    /**
     * 模板列表
     *
     * @return {@link List}<{@link Dict}>
     */
    @Override
    public List<Dict> listTemplate() {
        List<ImportExportTemplate> templateList = selectImportExportTemplateList(new ImportExportTemplate());
        List<Dict> res = templateList.stream().map(e -> {
            Long id = e.getId();
            String remark = e.getRemark();
            String v = id.toString();
            if (StrUtil.isNotBlank(remark)) {
                v = StrUtil.format("{}({})", v, remark);
            }
            return Dict.create().set("label", v).set("value", id);
        }).collect(Collectors.toList());
        return res;
    }
}
